#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DLDataType;
//定义双向链表节点结构
typedef struct ListNode
{
    DLDataType data;
    struct ListNode* next;
    struct ListNode* prev;
}DLNode;

//初始化和销毁
void DLInit(DLNode** pphead);//传入一个头节点
DLNode* DLInit2();//不传参，直接返回一个头节点
void DLDestory(DLNode* phead);
//这里如果传一级指针，需要将实参(plist)手动置为空，否则会造成野指针
//但是还是倾向于传一级指针，因为要保持接口的一致性

//打印
void DLPrint(DLNode* phead);

//双链表不会改变哨兵位，这里都可以传一级指针
//插入删除
void DLPushBack(DLNode* phead,DLDataType x);
void DLPushFront(DLNode* phead,DLDataType x);
void DLPopBack(DLNode* phead);
void DLPopFront(DLNode* phead);
//查找节点
DLNode* DLFind(DLNode* phead,DLDataType x);
//pos插入删除
void DLInsert(DLNode* pos,DLDataType x);
void DLErase(DLNode* pos);